#include <iostream>
using std::cout;
using std::endl;
//拷贝构造函数的调用时机
class Point{
public:
    Point(int x, int y)
    :_x(x)
    ,_y(y)
    {
        cout << "Point(int,int)" << endl;
    }

    //拷贝构造函数的&符号不可以去掉
    //一方面是去掉之后，编译器直接出错
    //另外一方面如果把&去掉，那么此时满足拷贝构造函数的调用时机2
    //形参和实参结合，又会进一步调用拷贝构造
    Point(const Point & rhs)
    :_x(rhs._x)
    ,_y(rhs._y)
    {
        cout << "Point(const Point &)" << endl;
    }
    void print(){
        cout << "Point::print" << endl;
    }

private:
    int _x;
    int _y;


};
//拷贝构造函数的调用时机1：用一个已经存在的对象创建另外一个新对象
//探究：拷贝构造函数的调用时机2
//函数的形参是一个对象，实参和形参相结合的时候
//形参和实参结合的时候：Point p = pt;
//拷贝构造函数的调用时机3:函数的返回结果是一个对象
//此时会有构造函数和拷贝构造函数的调用
Point pt(1, 2);
Point func(){
    //Point pt(1, 2);
    return pt;//执行return语句时，会调用一次拷贝构造函数
}


void test(){
    func();
}
//问题：拷贝构造函数会被调用几次？？？
void test2(){
    Point pt = func();//使用一个已知的对象创建一个新对象
                      //又会调用一次，所以会有两次拷贝构造
}

int main()
{
    test2();
    return 0;
}

